//将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。
//
// 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时，排列如下：
//
// L   C   I   R
//E T O E S I I G
//E   D   H   N
//
//
// 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。
//
// 请你实现这个将字符串进行指定行数变换的函数：
//
// string convert(string s, int numRows);
//
// 示例 1:
//
// 输入: s = "LEETCODEISHIRING", numRows = 3
//输出: "LCIRETOESIIGEDHN"
//
//
// 示例 2:
//
// 输入: s = "LEETCODEISHIRING", numRows = 4
//输出: "LDREOEIIECIHNTSG"
//解释:
//
//L     D     R
//E   O E   I I
//E C   I H   N
//T     S     G
// Related Topics 字符串
// 👍 864 👎 0

use std::ops::Add;

fn main() {
    let res = Solution::convert(String::from("LEETCODEISHIRING"), 3);
    println!("{}", res)
}

struct Solution;

//leetcode submit region begin(Prohibit modification and deletion)
impl Solution {
    pub fn convert(s: String, num_rows: i32) -> String {
        if num_rows == 0 {
            return String::from("");
        } else if num_rows == 1 {
            return s;
        } else {
            let rows = num_rows as usize;
            let mut res = String::from("");
            let cyc_size = (num_rows * 2 - 2) as usize;
            for i in 0..rows as usize {
                let mut j = 0 as usize;
                while j + i < s.len() {
                    res.push_str(&s[j + i..=j + i]);
                    if i != 0 && i != rows - 1 && j + cyc_size - i < s.len() {
                        res.push_str(&s[j + cyc_size - i..=j + cyc_size - i]);
                    }
                    j += cyc_size;
                }
            }
            res
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
